#pragma once
#include "Utils.h"
#include "PropertyInfo.h"

#include <vector>
#include <memory>
#include <string>

namespace Smo
{	
	using namespace std;
	class BaseObject;
	class Type
	{
		vector<PropertyInfo> mProperties;
		string mName;
	protected:
		void AddProperty(const string& propName, function<const BaseObject&()> getter)
		{
			PropertyInfo p;
			p.SetName(propName);
			mProperties.push_back(p);
		}
		
		SMO_SETTER_FOR(string, Name);
	public:
		SMO_GETTER_FOR_CONSTREF(vector<PropertyInfo>, Properties);
		SMO_GETTER_FOR_CONSTREF(string, Name);
	};
}